package com.obelisco.vista.plantillas;

//import ucla.cumlaude.exception.CumLaudeException;
import nextapp.echo2.app.Component;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ComponenteImprimirListener;
import com.obelisco.vista.componentes.ComponenteTransaccionDatosListener;
import com.obelisco.vista.componentes.DialogoError;
import com.obelisco.vista.componentes.PaneTransaccionBase;
import com.obelisco.vista.componentes.TipoFuncion;

public class VentanaTransaccionSimple extends VentanaTransaccionBase {

	protected ComponenteTransaccionDatosListener componenteDatos;
	
	@Override
	protected void onConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {		
		distribuirEventoConfirmarCambios(objeto,tipo, nombre);
	}

	@Override
	protected void inicializar() {
		distribuirEventoInicializar();		
	}

	@Override
	protected void onCancelar() {
		distribuirEventoCancelar();
	}

	@Override
	protected void onConfirmarEliminacion(Object objeto) {
		distribuirEventoConfirmarEliminacion(objeto);
	}

	@Override
	protected void onCrear() {
		//distribuirEventoCrear();
	}

	@Override
	protected void onFuncionPersonalizada(Object objeto, TipoFuncion tipoFuncion, String nombre) {
		distribuirEventoFuncion(objeto, tipoFuncion, nombre);
	}

	@Override
	protected void onIncluir(Object objeto) {
		distribuirEventoIncluir(objeto);
	}

	@Override
	protected void onModificar(Object objeto) {
		distribuirEventoModificar(objeto);
	}
	
	@Override
	protected void onConsultar(Object objetoEntidad) {;
		distribuirEventoConsultar(objetoEntidad);
	}
	
	@Override
	protected Object onBuscarObjetoEntidad() {
		return distribuirBuscarObjetoEntidad();
	}

	@Override
	protected boolean onValidarDatos(Object objeto, TipoFuncion tipoFuncion, String nombre) throws Exception {
		return distribuirEventoValidarDatos(objeto,tipoFuncion,nombre);
	}

	private void distribuirEventoCrear() {
		componenteDatos.onCrear();
	}
	
	private void distribuirEventoInicializar() {		
		componenteDatos.onInicializar();
	}

	private boolean distribuirEventoValidarDatos(Object objeto, TipoFuncion funcion, String nombre) {
		boolean validarDatos = true;
		if (!componenteDatos.onValidarDatos(objeto, funcion, nombre)) {
			validarDatos = false;
		}
		return validarDatos;
	}

	private void distribuirEventoConfirmarCambios(Object objeto,TipoFuncion tipo, String nombre) {	
		componenteDatos.onConfirmarCambios(objeto, tipo, nombre);
	}

	private void distribuirEventoObjetoEntidad(Object object) {
		componenteDatos.onObjetoEntidad(object);
	}

	private void distribuirEventoCancelar() {
		componenteDatos.onCancelar();
	}

	private void distribuirEventoConfirmarEliminacion(Object objeto) {
		componenteDatos.onConfirmarEliminacion(objeto);
	}

	private void distribuirEventoFuncion(Object objeto,TipoFuncion funcion, String nombre) {
		componenteDatos.onFuncionPersonalizada(objeto, funcion, nombre);
	}
	
	private void distribuirEventoIncluir(Object objeto) {
		componenteDatos.onIncluir(objeto);
	}
	
	private void distribuirEventoModificar(Object objeto) {
		componenteDatos.onModificar(objeto);
	}
	
	private void distribuirEventoConsultar(Object objeto) {
		componenteDatos.onConsultar(objeto);
	}
	
	private Object distribuirBuscarObjetoEntidad() {
		return componenteDatos.onBuscarObjetoEntidad();
	}

	public void addComponenteDatosListener(ComponenteDatosListener listener) {
		listeners.add(listener);
	}

	public void removeCatalogoListener(ComponenteDatosListener listener) {
		listeners.remove(listener);
	}
	
	@Override
	public void setObjetoEntidad(Object objetoEntidad) {
		// TODO MODIFICADO POR JOAN 
		distribuirEventoObjetoEntidad(objetoEntidad);
	}
	
	public void addComponenteImprimirListener(ComponenteImprimirListener listenerImprimir) {
		listenersImprimir.add(listenerImprimir);
	}

	//TODO AGREGADO POR JOAN
	public void setComponenteDatos(ComponenteTransaccionDatosListener componente) {
		
		if (componente instanceof Component) {

			Component component = (Component) componente;

			if (component instanceof PaneTransaccionBase) {
				PaneTransaccionBase pane = (PaneTransaccionBase) component;
				pane.setVentanaTransaccion(this);
			}

			if (isUsarTab()) {
				TabPaneLayoutData contenedorLayoutData = new TabPaneLayoutData();
				contenedorLayoutData.setTitle(this.getTituloTab());
				component.setLayoutData(contenedorLayoutData);
			}

			this.getAreaTrabajo().add(component);
			this.componenteDatos = componente;
			Class[] clases = componente.getClass().getInterfaces();
			for (int i = 0; i < clases.length; i++)
			{
				Class claseInterfaz = clases[i];
				if (claseInterfaz == ComponenteImprimirListener.class)
				{
					addComponenteImprimirListener((ComponenteImprimirListener) componente);
				}
			}
		}
	}

	public ComponenteTransaccionDatosListener getComponenteDatos() {
		return componenteDatos;
	}
}
